package com.spring.redis.operation.service.base;

import org.springframework.data.redis.core.ZSetOperations;

import java.util.Set;

/**
 * redis Operation zSet base interface
 *
 * @author zhouyu
 */
public interface ZSetRedisBaseService {

    /**
     * 添加一个元素
     *
     * @param key   key
     * @param value value
     * @param score score
     * @return java.lang.Boolean 是否添加成功
     */
    Boolean zAdd(String key, String value, double score);

    /**
     * 删除元素
     *
     * @param key    key
     * @param values values
     * @return java.lang.Long
     */
    Long zRemove(String key, Object... values);

    /**
     * 增加或减少score
     *
     * @param key   key
     * @param value value
     * @param score score
     * @return java.lang.Double
     */
    Double zIncrementScore(String key, String value, double score);

    /**
     * 查询value对应的score
     *
     * @param key   key
     * @param value value
     * @return java.lang.Double
     */
    Double zScore(String key, String value);

    /**
     * 获取value在zset中的排名
     *
     * @param key   key
     * @param value value
     * @return java.lang.Long 排名值
     */
    Long zRank(String key, String value);

    /**
     * 返回集合的长度
     *
     * @param key key
     * @return java.lang.Long 长度值
     */
    Long zSize(String key);

    /**
     * 查询集合中指定顺序的值, 0 -1 表示获取全部的集合内容,返回有序的集合，score小的在前面
     *
     * @param key   key
     * @param start start
     * @param end   end
     * @return java.util.Set
     */
    Set<Object> zRange(String key, int start, int end);

    /**
     * 查询集合中指定顺序的值和score，0, -1 表示获取全部的集合内容
     *
     * @param key   key
     * @param start start
     * @param end   end
     * @return java.util.Set
     */
    Set<ZSetOperations.TypedTuple<Object>> zRangeWithScore(String key, int start, int end);

    /**
     * 查询集合中指定顺序的值,返回有序的集合中,score大的在前面
     *
     * @param key   key
     * @param start key
     * @param end   end
     * @return java.util.Set 满足条件的集合
     */
    Set<Object> zReverseRange(String key, int start, int end);

    /**
     * 根据score的值，来获取满足条件的集合
     *
     * @param key key
     * @param min min
     * @param max max
     * @return java.util.Set 满足条件的集合
     */
    Set<Object> zRangeByScore(String key, int min, int max);
}